import request from "../utils/request";

/**
 * 封装专业计划管理相关的API请求 (使用独立参数)
 */
class MajorPlanRequest {

    /**
     * 新增专业计划
     * @param {string} majorCode - 专业代码
     * @param {string} majorName - 专业名称
     * @param {string} degreeType - 学位类型 (如: "专科", "本科")
     * @param {number} totalCredits - 总学分
     * @param {number} [status=1] - 状态 (1:启用, 0:停用)，可选，默认为1
     * @param {string} [remark] - 备注信息，可选
     * @returns {Promise<object>} - 创建成功的专业计划完整对象
     */
    async add(majorCode, majorName, degreeType, totalCredits, status = 1, remark = '') {
        const newPlan = await request({
            url: '/major-plans',
            method: 'post',
            data: {
                majorCode,
                majorName,
                degreeType,
                totalCredits,
                status,
                remark
            },
        });
        return newPlan;
    }

    /**
     * 查询专业计划列表（分页、筛选）
     * @param {object} [options={}] - 包含分页和筛选参数的对象
     * @param {number} [options.page=1] - 页码
     * @param {number} [options.size=10] - 每页数量
     * @param {string} [options.majorName] - 按专业名称模糊查询
     * @param {string} [options.majorCode] - 按专业代码精确查询
     * @param {number} [options.status] - 按状态筛选 (1:启用, 0:停用)
     * @returns {Promise<object>} - 标准分页列表数据 { total, pages, current, size, records }
     */
    async getList({ page, size, majorName, majorCode, status } = {}) {
        const listData = await request({
            url: '/major-plans',
            method: 'get',
            params: { // GET请求使用 params
                page,
                size,
                majorName,
                majorCode,
                status
            }, 
        });
        return listData;
    }

    /**
     * 获取单个专业计划详情
     * @param {number|string} id - 专业计划的主键ID
     * @returns {Promise<object>} - 单个专业计划的详细信息对象
     */
    async getById(id) {
        const planDetail = await request({
            url: `/major-plans/${id}`,
            method: 'get',
        });
        return planDetail;
    }

    /**
     * 更新专业计划信息
     * @param {number|string} id - 要更新的专业计划ID
     * @param {object} planData - 包含要更新字段的对象。
     * 例如: { majorName: '新名称', status: 0 }
     * @returns {Promise<object>} - 更新后的专业计划对象
     */
    async update(id, planData) {
        const updatedPlan = await request({
            url: `/major-plans/${id}`,
            method: 'put',
            data: planData,
        });
        return updatedPlan;
    }

    /**
     * 删除专业计划
     * @param {number|string} id - 要删除的专业计划ID
     * @returns {Promise<null>} - 成功时返回 null
     */
    async delete(id) {
        const result = await request({
            url: `/major-plans/${id}`,
            method: 'delete',
        });
        return result;
    }

    /**
     * 为专业计划关联课程
     * @param {number|string} majorId - 专业计划ID
     * @param {number} courseId - 要关联的课程ID
     * @param {number} isRequired - 是否必修 (1:是, 0:否)
     * @returns {Promise<null>} - 成功时返回 null
     */
    async associateCourse(majorId, courseId, isRequired) {
        const result = await request({
            url: `/major-plans/${majorId}/courses`,
            method: 'post',
            data: {
                courseId,
                isRequired
            },
        });
        return result;
    }

    /**
     * 将课程从专业计划中解绑
     * @param {number|string} majorId - 专业计划ID
     * @param {number|string} courseId - 要解绑的课程ID
     * @returns {Promise<null>} - 成功时返回 null
     */
    async unassociateCourse(majorId, courseId) {
        const result = await request({
            url: `/major-plans/${majorId}/courses/${courseId}`,
            method: 'delete',
        });
        return result;
    }
}

// 导出类的实例，方便在其他地方直接调用方法
export default new MajorPlanRequest();